from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import logging
import signal
import sys
import time
from datetime import datetime
from .sms_sender import SMSSender
from .config import Config

logger = logging.getLogger(__name__)


class ReminderScheduler:
    def __init__(self):
        self.config = Config()
        self.sms_sender = SMSSender()
        self.scheduler = BlockingScheduler(timezone=self.config.TIMEZONE)
        self.setup_logging()
        self.setup_signal_handlers()

    def setup_logging(self):
        """配置日志"""
        logging.basicConfig(
            level=getattr(logging, self.config.LOG_LEVEL),
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            handlers=[
                logging.StreamHandler(sys.stdout)
            ]
        )

    def setup_signal_handlers(self):
        """设置信号处理器，用于优雅关闭"""

        def signal_handler(signum, frame):
            logger.info("收到关闭信号，正在优雅停止调度器...")
            self.scheduler.shutdown()
            sys.exit(0)

        signal.signal(signal.SIGINT, signal_handler)
        signal.signal(signal.SIGTERM, signal_handler)

    def daily_reminder(self, custom_message=None):
        """每日抢券提醒任务"""
        try:
            current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            logger.info(f"执行定时提醒任务: {current_time}")

            results = self.sms_sender.send_to_family(custom_message)

            # 记录发送结果
            for phone, success in results:
                status = "成功" if success else "失败"
                logger.info(f"手机号 {phone}: 发送{status}")

        except Exception as e:
            logger.error(f"提醒任务执行失败: {e}")

    def add_reminder_jobs(self):
        """添加提醒任务：按照指定日期范围在每日 10:00 发送提醒。

        目标范围：
        - 10月27日～10月31日
        - 11月11日～11月15日
        - 11月26日～11月30日
        """

        # 定义要添加的日期范围（month, day-range）
        date_ranges = [
            {'month': '10', 'day': '27-31'},
            {'month': '11', 'day': '11-15'},
            {'month': '11', 'day': '26-30'},
        ]

        for idx, dr in enumerate(date_ranges):
            try:
                trigger = CronTrigger(month=dr['month'], day=dr['day'], hour=9, minute=50)
                job_id = f'reminder_range_{idx + 1}'
                job_name = f"抢券提醒 ({dr['month']}/{dr['day']} 每日9:50)"

                self.scheduler.add_job(
                    self.daily_reminder,
                    trigger=trigger,
                    id=job_id,
                    name=job_name,
                    args=[f"【每日9:50提醒】亲爱的家人，{dr['month']}月{dr['day']} 区间请记得抢券！"]
                )

                logger.info(f"已添加定时任务: {dr['month']}月{dr['day']} 每日 9:50 (id={job_id})")

            except Exception as e:
                logger.error(f"添加提醒任务失败 for {dr}: {e}")

    def add_test_job(self):
        """添加测试任务（立即执行一次）"""
        self.scheduler.add_job(
            self.daily_reminder,
            'date',
            run_date=datetime.now(),
            args=["【测试提醒】抢券提醒服务部署成功！服务已启动并开始监控。"],
            id='test_reminder'
        )

    def start(self):
        """启动调度器"""
        try:
            # 添加任务
            self.add_reminder_jobs()

            # 添加测试任务（可选）
            # self.add_test_job()

            logger.info("定时提醒服务启动成功！")
            logger.info(f"已配置提醒时间: {', '.join(self.config.REMINDER_TIMES)}")
            logger.info(f"监控手机号: {', '.join(self.config.FAMILY_PHONES)}")

            # 启动调度器
            self.scheduler.start()

        except Exception as e:
            logger.error(f"调度器启动失败: {e}")
            sys.exit(1)